package com.halzhang.android.startupnews.data.utils; import android.content.Context; import android.os.Build; import android.support.annotation.NonNull; import android.webkit.WebSettings; import com.squareup.okhttp.Cache; import com.squareup.okhttp.Interceptor; import com.squareup.okhttp.OkHttpClient; import com.squareup.okhttp.Request; import com.squareup.okhttp.Response; import java.io.File; import java.io.IOException; import java.net.CookieManager; import java.net.CookiePolicy; import java.util.concurrent.TimeUnit; import javax.inject.Inject; import javax.inject.Singleton; /** * okhttp * Created by Hal on 2015/11/12. */ @Singleton public class OkHttpClientHelper { public interface CookieFactory { public String getCookie(); } /** * USER-AGENT */ public static final String USER_AGENT = "Mozilla/5.0 (Linux; Android " + Build.VERSION.RELEASE + "; " + Build.MODEL + " Build/" + Build.ID + ")"; private static final long SIZE_OF_CACHE = 10 * 1024 * 1024; // 10 MB private OkHttpClient mOkHttpClient; private CookieFactory mCookieFactory; @NonNull private Context mContext; @Inject public OkHttpClientHelper(CookieFactory cookieFactory, @NonNull Context context) { mCookieFactory = cookieFactory; mContext = context; init(mContext, mCookieFactory); } private void init(final Context context, CookieFactory factory) { mCookieFactory = factory; if (mOkHttpClient == null) { Interceptor mCacheControlInterceptor = new Interceptor() { @Override public Response intercept(Chain chain) throws IOException { Request request = chain.request(); Request.Builder builder = request.newBuilder(); builder.addHeader("Accept-Language", "zh-cn"); builder.addHeader("Accept", "*/*"); if (mCookieFactory != null) { builder.addHeader("Cookie", mCookieFactory.getCookie()); } if (Build.VERSION.SDK_INT > Build.VERSION_CODES.JELLY_BEAN) { builder.header("User-Agent", WebSettings.getDefaultUserAgent(context)); } else { builder.header("User-Agent", USER_AGENT); } // Add Cache Control only for GET methods if (request.method().equals("GET")) { if (NetworkUtils.isNetworkAvailable(context)) { // 1 day request.newBuilder().header("Cache-Control", "only-if-cached").build(); } else { // 4 weeks stale request.newBuilder().header("Cache-Control", "public, max-stale=2419200").build(); } } Response response = chain.proceed(request); // Re-write response CC header to force use of cache return response.newBuilder() .header("Cache-Control", "public, max-age=86400") // 1 day .build(); } }; Cache cache = new Cache(new File(context.getCacheDir(), "http"), SIZE_OF_CACHE); mOkHttpClient = new OkHttpClient(); mOkHttpClient.setCache(cache); mOkHttpClient.setConnectTimeout(30, TimeUnit.SECONDS); mOkHttpClient.setReadTimeout(30, TimeUnit.SECONDS); // Add Cache-Control Interceptor mOkHttpClient.networkInterceptors().add(mCacheControlInterceptor); //重试 mOkHttpClient.interceptors().add(new Interceptor() { @Override public Response intercept(Chain chain) throws IOException { Request request = chain.request(); // try the request Response response = chain.proceed(request); int tryCount = 0; while (!response.isSuccessful() && tryCount < 3) { tryCount++; // retry the request response = chain.proceed(request); } // otherwise just pass the original response on return response; } }); mOkHttpClient.setCookieHandler(new CookieManager(new PersistentCookieStore(context), CookiePolicy.ACCEPT_ALL)); } } public OkHttpClient getOkHttpClient() { if (mOkHttpClient == null) { throw new RuntimeException("okhttp uninit!"); } return mOkHttpClient; } }